function makeIterator(arr) {
    if (arr.length === 0) {
        return
    }
    let done = false
    let crtIndex = 0

    return {
        next: () => {
            if (crtIndex > arr.length - 1) {
                return {
                    done: true,
                    value: undefined
                }
            } else {
                let res = {
                    done: done,
                    value: arr[crtIndex]
                }
                crtIndex += 1
                return res
            }
        }
    }
}

let iteratorArray = makeIterator([1, 2, 3])

let res = iteratorArray.next()
while (!res.done) {
    console.dir(res)
    res = iteratorArray.next()
}

// 如果是使用 do ... while 循环的话会多一次

// 这里依然会报错是因为 for ... of 语法需要检查的是 [Symbol.iterator] 属性
// for (let x of iteratorArray) {
//     console.dir(x)
// }

const obj = {
    [Symbol.iterator]: function () {
        return {
            next: function () {
                return {
                    value: 1,
                    done: true,
                }
            }
        }
    }
}

// 这里 如果第一次就返回 done: true
for (let i of obj) {
    console.dir(i)
}
